﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ControlsLib;
using GestionePolveriLib.BL;
using BrightIdeasSoftware;
using GestionePolveriLib.Facades;
using GestionePolveri2.Filters;
using FrameworkLib.Facades.Paging;
using FrameworkLib.Filters;
using GestionePolveri2.DAL;
using GestionePolveriLib.Utilities;
using GestionePolveriLib.Facades.Extensions;

namespace GestionePolveri2
{
    public partial class ComposizioneColoreManagerExt : ComposizioneColoreBaseExt
    {
        private ComposizioneColoreManagerExtFilter cf2 = null;
        private ComposizioneColorePageFacadeExt pf = null;

        public ComposizioneColoreManagerExt()
        {
            InitializeComponent();

            if (!this.DesignMode)
            {
                this.AddCustomButton("btnAssociaPolvere", "Associa Polvere");

                pf = new ComposizioneColorePageFacadeExt(100);

                this.CanModify = true;
                //this.ShowOnlyCustomButton = false;
                this.ButtonClicked += new EventHandler<CustomEventArgs<ComposizioneColore>>(Anagrafica_ButtonClicked);
                this.ItemSelected += new EventHandler<CustomEventArgs<ComposizioneColore>>(Anagrafica_ItemSelected);
                this.CustomButtonClicked += new EventHandler<CustomEventArgs<ComposizioneColore>>(Anagrafica_CustomButtonClicked);

                // using pager...
                this.ShowPager = true;
                pf.Pager = this.Pager;
                this.Pager.PageChanged += new EventHandler<NavigationEventArgs>(Pager_PageChanged);
                this.Pager.InitializeControl();

                pf.GetNumberOfPages();

                // using filter...
                this.UseFilter = true;
                cf2 = new ComposizioneColoreManagerExtFilter();
                cf2.ExecuteFilter += new EventHandler(cf2_ExecuteFilter);
                this.PopupContainerControl = cf2.PopupContainerControl;

                ManageData();
            }
        }

        void cf2_ExecuteFilter(object sender, EventArgs e)
        {
            this.IsFiltering = true;

            pf.GetNumberOfPages(cf2.FilterBag);

            ManageData();
        }

        void Pager_PageChanged(object sender, NavigationEventArgs e)
        {
            switch (e.NavigationEventType)
            {
                case NavigationEventType.First:
                    pf.First();
                    break;
                case NavigationEventType.Next:
                    pf.Next();
                    break;
                case NavigationEventType.Previous:
                    pf.Previous();
                    break;
                case NavigationEventType.Last:
                    pf.Last();
                    break;
                case NavigationEventType.GotToPosition:
                    pf.PageNumber = e.Position;
                    break;
                default:
                    break;
            }

            ManageData();
        }

        private void ManageData()
        {
            if (!this.IsFiltering)
            {
                LoadData(false);
            }
            else
            {
                LoadData(cf2.FilterBag);
            }
        }

        private void LoadData(bool selectLast)
        {
            pf.RunAsync<List<ComposizioneColore2>>(()=>pf.GetComposizioneColore2(), (result) =>
            {
                if (result != null)
                {
                    this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                    this.objectListView1.SetObjects((List<ComposizioneColore2>)result, true);
                }
                else
                {
                    this.objectListView1.Items.Clear();

                    this.ResetButtons();
                    this.ClearControls(this.Controls);

                    this.objectListViewColori.Items.Clear();
                    this.objectListViewPolveri.Items.Clear();
                }
            });

            //pf.LoadAsync((result) =>
            //{
            //    if (result != null)
            //    {
            //        this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
            //        this.objectListView1.SetObjects((List<ComposizioneColore>)result, true);
            //    }
            //    else
            //    {
            //        this.objectListView1.Items.Clear();

            //        this.ResetButtons();
            //        this.ClearControls(this.Controls);

            //        this.objectListViewColori.Items.Clear();
            //        this.objectListViewPolveri.Items.Clear();
            //    }
            //});
        }

        private void LoadData(FilterBase<ComposizioneColori> filter)
        {
            pf.RunAsync<List<ComposizioneColore2>>(() => pf.GetComposizioneColore2(filter), (result) =>
            {
                if (result != null)
                {
                    this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                    this.objectListView1.SetObjects((List<ComposizioneColore2>)result, true);
                }
                else
                {
                    this.objectListView1.Items.Clear();

                    this.ResetButtons();
                    this.ClearControls(this.Controls);

                    this.objectListViewColori.Items.Clear();
                    this.objectListViewPolveri.Items.Clear();
                }
            });

            //pf.RunAsync<List<ComposizioneColore>>(() => pf.GetAll(filter), (result) =>
            //{
            //    if (result != null)
            //    {
            //        this.objectListView1.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
            //        this.objectListView1.SetObjects((List<ComposizioneColore>)result, true);
            //    }
            //    else
            //    {
            //        this.objectListView1.Items.Clear();

            //        this.ResetButtons();
            //        this.ClearControls(this.Controls);

            //        this.objectListViewColori.Items.Clear();
            //        this.objectListViewPolveri.Items.Clear();
            //    }
            //});
        }

        private void LoadColori()
        {
            ColoriFacade fcf = new ColoriFacade();
            fcf.LoadAsync((result) =>
            {
                this.objectListViewColori.SetObjects((List<Colore>)result);
            });
        }

        private void LoadPolveri(bool setUpPolveriAssociate)
        {
            PolvereFacade fcf = new PolvereFacade();
            fcf.LoadAsync((result) =>
            {
                List<PolvereExt> pexts = new List<PolvereExt>();
                foreach (Polvere p in (List<Polvere>)result)
                {
                    PolvereExt pExt = new PolvereExt(p);
                    pexts.Add(pExt);
                }

                this.objectListViewPolveri.AddDecoration(new EditingCellBorderDecoration { UseLightbox = true });
                this.objectListViewPolveri.SetObjects(pexts);

                if (setUpPolveriAssociate)
                {
                    // check tutte le polveri associate al colore presente nella listview dei colori...
                    OLVListItem olvi = this.objectListViewColori.GetItem(0);
                    Colore c = (Colore)olvi.RowObject;

                    ComposizioneColoreFacadeExt ccfext = new ComposizioneColoreFacadeExt();
                    List<PolvereExt> m_polveriAssociate = ccfext.GetPolveriAssociate(c.ID);

                    if (m_polveriAssociate != null)
                    {
                        this.objectListViewPolveri.CheckedObjects = null;
                        foreach (PolvereExt polvere in m_polveriAssociate)
                        {
                            foreach (OLVListItem olviP in this.objectListViewPolveri.Items)
                            {
                                if (olviP.RowObject != null && olviP.Text == polvere.CodicePolvere)
                                {
                                    this.objectListViewPolveri.ToggleCheckObject(olviP.RowObject);

                                    if (polvere.Base)
                                        this.objectListViewPolveri.ToggleSubItemCheckBox(olviP.RowObject, this.olvPolvereBase);

                                    if (polvere.Venatura)
                                        this.objectListViewPolveri.ToggleSubItemCheckBox(olviP.RowObject, this.olvPolvereVenatura);

                                    break;
                                }
                            }
                        }
                    }
                }
                // check tutte le polveri associate al colore presente nella listview dei colori...
            });
        }

        void Anagrafica_CustomButtonClicked(object sender, CustomEventArgs<ComposizioneColore> e)
        {
            if (e.ButtonName.Equals("btnAssociaPolvere", StringComparison.InvariantCultureIgnoreCase))
            {
                if (base.Current == null) return;

                AssociaPolvereDialog apd = new AssociaPolvereDialog();
                if(apd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    if (apd.Polveri != null)
                    {
                        List<PolvereExt> m_polveri = new List<PolvereExt>();
                        foreach (PolvereExt value in this.objectListViewPolveri.CheckedObjects) m_polveri.Add(value);

                        PolveriComparer pc = new PolveriComparer();
                        foreach (Polvere p in apd.Polveri)
                        {
                            if(!m_polveri.Contains(p, pc))
                              m_polveri.Add(new PolvereExt(p)); 
                        }

                        this.objectListViewPolveri.SetObjects(m_polveri);

                        foreach (OLVListItem olvi in this.objectListViewPolveri.Items)
                        {
                            this.objectListViewPolveri.ToggleCheckObject(olvi.RowObject);
                        }
                    }
                }
            }
        }

        void Anagrafica_ButtonClicked(object sender, CustomEventArgs<ComposizioneColore> e)
        {
            ComposizioneColoreFacade impf = new ComposizioneColoreFacade();
            ComposizioneColore data = new ComposizioneColore();

            switch (e.Action)
            {
                case Actions.Cancel:
                    break;
                case Actions.New:
                    {
                        base.ClearControls(this.Controls);

                        LoadColori();
                        //LoadPolveri(false);
                    }
                    break;
                case Actions.Add:
                    {
                        ComposizioneColoreFacadeExt impfExt = new ComposizioneColoreFacadeExt();
                        List<ComposizioneColoreExt> dataExts = new List<ComposizioneColoreExt>();

                        foreach (Colore colore in this.objectListViewColori.CheckedObjects)
                        {
                            //OLVListItem olvi = this.objectListViewColori.GetItem(0);
                            //Colore colore = (Colore)olvi.RowObject;

                            List<PolvereExt> m_polveri = new List<PolvereExt>();
                            foreach (PolvereExt value in this.objectListViewPolveri.CheckedObjects) m_polveri.Add(value);

                            ComposizioneColoreExt dataExt = new ComposizioneColoreExt();
                            dataExt.Colore = colore;
                            dataExt.Polveri = m_polveri;

                            dataExts.Add(dataExt);
                        }

                        impfExt.Add(dataExts);

                        this.objectListViewColori.CheckedObjects = null;
                        this.objectListViewPolveri.CheckedObjects = null;
                        foreach (OLVListItem olviP in this.objectListViewPolveri.Items)
                        {
                            if (olviP.RowObject != null)
                            {
                                this.objectListViewPolveri.UncheckSubItem(olviP.RowObject, this.olvPolvereBase);
                                this.objectListViewPolveri.UncheckSubItem(olviP.RowObject, this.olvPolvereVenatura);
                            }
                        }

                        LoadData(false);
                    }
                    break;
                case Actions.Modify:
                    {
                        data.ID = base.Current.ID;

                        // colore sul quale stiamo lavorando...
                        OLVListItem olvi = this.objectListViewColori.GetItem(0);
                        Colore colore = (Colore)olvi.RowObject;

                        List<PolvereExt> m_polveri = new List<PolvereExt>();
                        foreach (PolvereExt p in this.objectListViewPolveri.CheckedObjects)
                        {
                            m_polveri.Add(p);
                        }

                        ComposizioneColoreExt dataExt = new ComposizioneColoreExt();
                        dataExt.Colore = colore;
                        dataExt.Polveri = m_polveri;

                        ComposizioneColoreFacadeExt impfExt = new ComposizioneColoreFacadeExt();
                        impfExt.Modify(dataExt);

                        LoadData(false);
                    }
                    break;
                case Actions.Delete:
                    {
                        data.ID = base.Current.ID;

                        // colore sul quale stiamo lavorando...
                        OLVListItem olvi = this.objectListViewColori.GetItem(0);
                        if (olvi != null)
                        {
                            Colore colore = (Colore)olvi.RowObject;

                            ComposizioneColoreExt dataExt = new ComposizioneColoreExt();
                            dataExt.Colore = colore;

                            ComposizioneColoreFacadeExt impfExt = new ComposizioneColoreFacadeExt();
                            impfExt.Delete(dataExt);

                            this.objectListViewColori.CheckedObjects = null;
                            this.objectListViewPolveri.CheckedObjects = null;
                            foreach (OLVListItem olviP in this.objectListViewPolveri.Items)
                            {
                                if (olviP.RowObject != null)
                                {
                                    this.objectListViewPolveri.UncheckSubItem(olviP.RowObject, this.olvPolvereBase);
                                    this.objectListViewPolveri.UncheckSubItem(olviP.RowObject, this.olvPolvereVenatura);
                                }
                            }

                            LoadData(false);
                        }
                        else
                        {
                            MessageBox.Show("Attenzione, non hai selezionato correttamente l'elemento da cancellare !", "Composizione Colori", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        }
                    }
                    break;
                default:
                    break;
            }
        }

        void objectListViewColori_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            // per simulare il readonly a livello di riga...
            //e.NewValue = e.CurrentValue;
        }

        void objectListViewPolveri_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Unchecked)
            {
                //this.objectListViewPolveri.GetItem(e.Index).RowObject
                this.objectListViewPolveri.UncheckSubItem(this.objectListViewPolveri.GetItem(e.Index).RowObject, this.olvPolvereBase);
                this.objectListViewPolveri.UncheckSubItem(this.objectListViewPolveri.GetItem(e.Index).RowObject, this.olvPolvereVenatura);
            }
        }

        void Anagrafica_ItemSelected(object sender, CustomEventArgs<ComposizioneColore> e)
        {
            base.Current = e.Item;

            this.objectListViewColori.ItemCheck -= new ItemCheckEventHandler(objectListViewColori_ItemCheck);
            this.objectListViewPolveri.ItemCheck -= new ItemCheckEventHandler(objectListViewPolveri_ItemCheck);

            Colore c = e.Item.Colore;

            List<Colore> m_colori = new List<Colore>();
            m_colori.Add(c);
            this.objectListViewColori.SetObjects(m_colori);

            //this.objectListViewColori.CheckedObjects = null;
            //foreach (OLVListItem olvi in this.objectListViewColori.Items)
            //{
            //    if (olvi.RowObject != null && olvi.Text == e.Item.Colore.CodiceColore)
            //    {
            //        this.objectListViewColori.ToggleCheckObject(olvi.RowObject);
            //        break;
            //    }
            //}

            //LoadPolveri(true);

            ComposizioneColoreFacadeExt ccfext = new ComposizioneColoreFacadeExt();
            List<PolvereExt> m_polveriAssociate = ccfext.GetPolveriAssociate(e.Item.Colore.ID);
            this.objectListViewPolveri.SetObjects(m_polveriAssociate);

            this.objectListViewPolveri.CheckedObjects = null;
            foreach (Polvere polvere in m_polveriAssociate)
            {
                foreach (OLVListItem olvi in this.objectListViewPolveri.Items)
                {
                    if (olvi.RowObject != null && olvi.Text == polvere.CodicePolvere)
                    {
                        this.objectListViewPolveri.ToggleCheckObject(olvi.RowObject);
                        break;
                    }
                }
            }

            this.objectListViewPolveri.ItemCheck += new ItemCheckEventHandler(objectListViewPolveri_ItemCheck);
            this.objectListViewColori.ItemCheck += new ItemCheckEventHandler(objectListViewColori_ItemCheck);
        }

        private void chkbColoreCodice_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox chk = (CheckBox)sender;
            ManageFilter(chk, this.olvColumn1);
        }

        private void chkCodicePolvere_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox chk = (CheckBox)sender;
            ManageFilter(chk, this.olvColumn2);
        }

        private void chkbFornitore_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox chk = (CheckBox)sender;
            ManageFilter(chk, this.olvColumn3);
        }

        private void chkbApplicazione_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox chk = (CheckBox)sender;
            ManageFilter(chk, this.olvColumn4);
        }
    }

    public class ComposizioneColoreBaseExt : AnagraficaManagerObjectListView<ComposizioneColore> { }
}
